#include "UART3.h"

void USART3_Init(void){
    // 开启时钟（USART3在APB1总线）
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); // 修改为USART3
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // GPIOB时钟使能

    // 初始化引脚（PB10-TX，PB11-RX）
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    // PB10:USART3_TX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);        // 修改为GPIOB

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;    // PB11:USART3_RX
    GPIO_Init(GPIOB, &GPIO_InitStructure);        // 修改为GPIOB

    // USART配置
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART3, &USART_InitStructure);     // 修改为USART3

    // 中断配置
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 修改为USART3
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; // 修改为USART3中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 12;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // 启动USART3
    USART_Cmd(USART3, ENABLE); // 修改为USART3
}

// 中断处理函数（函数名必须与向量表一致）
void USART3_IRQHandler(void) { // 修改为USART3的中断处理函数
    if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { // 检查USART3
        char data = USART_ReceiveData(USART3); // 修改为USART3
        BaseType_t stat = pdTRUE;
        xQueueSendFromISR(queue, &data, &stat);
        USART_ClearITPendingBit(USART3, USART_IT_RXNE); // 清除USART3中断标志
    }
}

// 发送单字节
void USART3_SendByte(uint8_t Byte){ // 函数名修改
    USART_SendData(USART3, Byte);   // 修改为USART3
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); // 检查USART3标志
}

// 格式化输出函数
void printf3(char *format, ...){    // 函数名建议修改
    char strs[100] = {0};    
    va_list list;
    va_start(list, format);
    vsprintf(strs, format, list);
    va_end(list);
    for(uint8_t i=0; strs[i] != '\0'; i++){
        USART3_SendByte(strs[i]);  // 调用USART3发送函数
    }
}
